﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.OleDb;
using DTO;
namespace DAO
{
    public class AccountDAO
    {
        /// <summary>
        /// 
        /// </summary>
        DataProvider dp = new DataProvider();

        public AccountDAO()
        {
            
        }
        /// <summary>
        /// Kiểm tra Email này đã tồn tại trong csdl chưa
        /// </summary>
        /// <param name="email"> email cần kiểm tra</param>
        /// <returns> true nếu đã tồn tại false nếu chưa tồn tại</returns>
        public bool EmailExists(string email)
        {
            bool result = false;
            OleDbConnection conn = dp.ConnectionData();
            try
            {
               //code xử lí
                string strSql = "select * from Account where Email=@Email";
                OleDbCommand cmd = new OleDbCommand(strSql, conn);

                cmd.Parameters.Add("@Email", OleDbType.VarChar);
                cmd.Parameters["@Email"].Value = email;

                OleDbDataReader dr = cmd.ExecuteReader();
                if (dr.HasRows)
                    result = true;
                else
                    result = false;
            }
            catch (Exception ex)
            {

                throw ex;
            }
            finally
            {
                conn.Close();
                
            }
            return result;
            
        }

        /// <summary>
        /// Thêm 1 Account vào csdl
        /// </summary>
        /// <param name="account"> đối tượng được thêm</param>
        /// <returns>0 nếu ko thêm dc hoặc 1 số nguyên dương >0: Id của Account</returns>
        public int InsertAccount(AccountDTO account)
        {
            int result = 0;
            OleDbConnection conn = dp.ConnectionData();
            try
            {
               //code
                string strSql = "Insert into Account(Email,Hash,Name,DayOfBirth,Phone,Address,PublicKey,PrivateKey,Salt)";
                strSql+=" values(@Email,@Hash,@Name,@DayOfBirth,@Phone,@Address,@PublicKey,@PrivateKey,@Salt)";

                OleDbCommand cmd = new OleDbCommand(strSql, conn);

                cmd.Parameters.Add("@Email", OleDbType.VarChar);
                cmd.Parameters.Add("@Hash", OleDbType.VarChar);
                cmd.Parameters.Add("@Name", OleDbType.VarWChar);
                cmd.Parameters.Add("@DayOfBirth", OleDbType.Date);
                cmd.Parameters.Add("@Phone", OleDbType.VarChar);
                cmd.Parameters.Add("@Address", OleDbType.VarWChar);
                cmd.Parameters.Add("@PublicKey", OleDbType.VarChar);
                cmd.Parameters.Add("@PrivateKey", OleDbType.VarChar);
                cmd.Parameters.Add("@Salt", OleDbType.VarChar);

                cmd.Parameters["@Email"].Value = account.Email;
                cmd.Parameters["@Hash"].Value = account.Hash;
                cmd.Parameters["@Name"].Value = account.Name;
                cmd.Parameters["@DayOfBirth"].Value = account.DayOfBirth;
                cmd.Parameters["@Phone"].Value = account.Phone;
                cmd.Parameters["@Address"].Value = account.Address;
                cmd.Parameters["@PublicKey"].Value = account.PublicKey;
                cmd.Parameters["@PrivateKey"].Value = account.PrivateKey;
                cmd.Parameters["@Salt"].Value = account.Salt;

                cmd.ExecuteNonQuery();
                strSql = "select @@IDENTITY";
                cmd = new OleDbCommand(strSql, conn);
                account.AccountId = (int)cmd.ExecuteScalar();
                result = account.AccountId;

            }
            catch (Exception ex)
            {

                throw ex;
            }
            finally
            {
                conn.Close();
                
            }
            return result;
            
        }

        /// <summary>
        /// Cập nhật lại tài khoản
        /// </summary>
        /// <param name="account"> đối tượng để cập nhật</param>
        /// <returns>1 nếu cập nhật thành công, 0 nếu thất bại</returns>
        public bool UpdateAccount(AccountDTO account)
        {
            bool result = false;
            OleDbConnection conn = dp.ConnectionData();
            try
            {
                //code xử lí
                string strSql = "Update Account";
                strSql += " set Name=@Name, Hash=@Hash, DayOfBirth=@DayOfBirth, Phone=@Phone, Address=@Address, Salt=@Salt";
                strSql += " where Email=@Email";

                OleDbCommand cmd = new OleDbCommand(strSql, conn);

                cmd.Parameters.Add("@Hash", OleDbType.VarChar);
                cmd.Parameters.Add("@Name", OleDbType.VarWChar);
                cmd.Parameters.Add("@DayOfBirth", OleDbType.Date);
                cmd.Parameters.Add("@Phone", OleDbType.VarChar);
                cmd.Parameters.Add("@Address", OleDbType.VarWChar);
                cmd.Parameters.Add("@Salt", OleDbType.VarChar);
                cmd.Parameters.Add("@Email", OleDbType.VarChar);

                cmd.Parameters["@Hash"].Value = account.Hash;
                cmd.Parameters["@Name"].Value = account.Name;
                cmd.Parameters["@DayOfBirth"].Value = account.DayOfBirth;
                cmd.Parameters["@Phone"].Value = account.Phone;
                cmd.Parameters["@Address"].Value = account.Address;
                cmd.Parameters["@Salt"].Value = account.Salt;
                cmd.Parameters["@Email"].Value = account.Email;

                cmd.ExecuteNonQuery();
                result = true;

            }
            catch (Exception ex)
            {

                throw ex;
            }
            finally
            {
                conn.Close();
                
            }
            return result;
        }

        /// <summary>
        /// lấy thông tin của 1 tài khoản
        /// </summary>
        /// <param name="Id"> Id của của </param>
        /// <returns></returns>
        public AccountDTO GetAccountInfo(string email)
        {
            AccountDTO account =null;
           
            OleDbConnection conn = dp.ConnectionData();
            try
            {
                string strSql = "select * from Account where Email=@Email";

                OleDbCommand cmd = new OleDbCommand(strSql, conn);

                cmd.Parameters.Add("@Email", OleDbType.VarChar);
                cmd.Parameters["@Email"].Value = email;

                OleDbDataReader dr = cmd.ExecuteReader();

                if (dr.HasRows)
                {
                    dr.Read();
                    account = new AccountDTO();
                    //account.AccountId = Int32.Parse(dr["ID"].ToString());
                    account.Email = (string)dr["Email"];
                    account.Hash = (string)dr["Hash"];
                    account.Name = (string)dr["Name"];
                    account.DayOfBirth = (DateTime)dr["DayOfBirth"];
                    account.Phone = (string)dr["Phone"];
                    account.PublicKey = (string)dr["PublicKey"];
                    account.PrivateKey = (string)dr["PrivateKey"];
                    account.Salt = (string)dr["Salt"];
                    account.Address = (string)dr["Address"];

                }
                else
                {
 
                }
            }
            catch (Exception ex)
            {

                throw ex;
            }
            finally
            {
                conn.Close();
                
            }
            return account;
        }
        /// <sumary>
        /// 
        /// </sumary>
        /// 
        public List<AccountDTO> GetAllAccountInfo()
        {
            List<AccountDTO> list = new List<AccountDTO>();

            OleDbConnection conn = dp.ConnectionData();
            try
            {
                string strSql = "select * from Account";

                OleDbCommand cmd = new OleDbCommand(strSql, conn);

                OleDbDataReader dr = cmd.ExecuteReader();

                while (dr.Read())
                {
                    AccountDTO account = null;
                    account = new AccountDTO();
                    //account.AccountId = Int32.Parse(dr["ID"].ToString());
                    account.Email = (string)dr["Email"];
                    account.Hash = (string)dr["Hash"];
                    account.Name = (string)dr["Name"];
                    account.DayOfBirth = (DateTime)dr["DayOfBirth"];
                    account.Phone = (string)dr["Phone"];
                    account.PublicKey = (string)dr["PublicKey"];
                    account.PrivateKey = (string)dr["PrivateKey"];
                    account.Salt = (string)dr["Salt"];
                    account.Address = (string)dr["Address"];
                    list.Add(account);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conn.Close();

            }
            return list;
        }
       
    }
}
